"""
两个产品(两种类型的书)
"""
import abc


# 真正进行实例化的类
class TechnicalBooks(object):
    """技术书籍"""

    def publish(self):
        return "Python-Book"


class LiteraryBooks(object):
    """文学书籍"""

    def publish(self):
        return "Black Hole Book"


# 抽象工厂：先定义抽象类，然后每种类型的书籍都有自己对于的工厂
class AbstractFactory(metaclass=abc.ABCMeta):
    """抽象工厂"""

    @abc.abstractmethod
    def publish_book(self):
        pass


class TechnicalFactory(AbstractFactory):
    """技术书籍工厂"""

    def publish_book(self):
        return TechnicalBooks()


class LiteraryFactory(AbstractFactory):
    """文学书籍工厂"""

    def publish_book(self):
        return LiteraryBooks()

it_books2 = TechnicalFactory().publish_book()
print(it_books2.publish())

ly_books2 = LiteraryFactory().publish_book()
print(ly_books2.publish())

"""
工厂方法的使用场景：
当系统中拥有的子类很多，并且以后可能还需要不断拓展增加不同的子类时。
当设计系统时，还不能明确具体有哪些类时。
在工厂方法中，使用者不需要知道具体的产品类名，只需要知道其对应的工厂即可。
"""
